package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import model.*;

public abstract class APMaterial {

	public static void insertarMaterial(Material mat) {
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Material (idMaterial, nombre, puntoPedido, costo,stock,idProveedor,estado) VALUES (?,?,?,?,?,?,1)";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, mat.getCodigo());
			ps.setString(2, mat.getNombre());
			ps.setInt(3, mat.getPuntoPedido());
			ps.setFloat(4, mat.getCosto());
			ps.setInt(5, mat.getStock());
			ps.setInt(6, mat.getIdProveedor());
			ps.execute();

			AdministradorConexiones.getInstancia().cerrarConexion(con);
		} catch (SQLException e) {
			System.out.println("Mensaje Error al Insertar Material: " + e.getMessage());
			System.out.println("Stack Trace al Insertar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}

	public static Material buscarMaterial(int idMaterial) {
		Material i = null;
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia select
			String senten = "SELECT * FROM Material where estado = 1 and  idMaterial = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, idMaterial);
			ResultSet result = ps.executeQuery();
			while (result.next()) {
				i = new Material(result.getInt("idMaterial"), result.getString("nombre"), result.getInt("puntoPedido"), result.getFloat("costo"), result.getInt("stock"),result.getInt("idProveedor"));
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Buscar Material: " + e.getMessage());
			System.out.println("Stack Trace al Buscar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return i;
	}

	public static void modificarMaterial(Material mat) {

		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "UPDATE Material set nombre = ?, puntoPedido = ?, costo = ?, stock = ?, idProveedor = ? where idMaterial = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, mat.getNombre());
			ps.setInt(2, mat.getPuntoPedido());
			ps.setFloat(3, mat.getCosto());
			ps.setInt(4, mat.getStock());
			ps.setInt(5, mat.getIdProveedor());
			ps.setInt(6, mat.getCodigo());
			ps.execute();

			AdministradorConexiones.getInstancia().cerrarConexion(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Modificar Material: " + e.getMessage());
			System.out.println("Stack Trace al Modificar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}

	public static void borrarMaterial(int idMaterial) {
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino	
			String senten = "UPDATE Material SET estado = 0 where idMaterial = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, idMaterial);
			ps.execute();

			AdministradorConexiones.getInstancia().cerrarConexion(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Borrar Material: " + e.getMessage());
			System.out.println("Stack Trace al Borrar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
	}

	public static Material buscarMaterialNombre(String nombre) {
		Material i = null;
		// Obtener conexion BD
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia select
			String senten = "SELECT * FROM Material where estado = 1 and  nombre = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, nombre);
			ResultSet result = ps.executeQuery();
			while (result.next()) {
				i = new Material(result.getInt("idMaterial"), result.getString("nombre"), result.getInt("puntoPedido"), result.getFloat("costo"), result.getInt("stock"),result.getInt("idProveedor"));
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);
			return i;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al Buscar Material: " + e.getMessage());
			System.out.println("Stack Trace al Buscar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
	}

	public static Vector<Material> buscarMaterialesPuntoDePedido() {
		Vector <Material >materialesPtoPedido = new Vector<Material>();
		Connection con = AdministradorConexiones.getInstancia().crearConexion();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino	
			String senten = "SELECT * FROM Material  where estado = 1 and stock <= puntoPedido and idMaterial not in (select distinct idMaterial from Material_OrdenDeCompra mo inner join OrdenDeCompra oc on mo.idOrdenDeCompra = oc.idOrdenDeCompra where oc.estado = 'Pendiente de envio' or oc.estado = 'Esperando entrega')";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while(result.next())
			{
				materialesPtoPedido.add(new Material(result.getInt("idMaterial"), result.getString("nombre"), result.getInt("puntoPedido"), result.getFloat("costo"), result.getInt("stock"), result.getInt("idProveedor")));
			}

			AdministradorConexiones.getInstancia().cerrarConexion(con);

			return materialesPtoPedido;	
		} catch (SQLException e) {
			System.out.println("Mensaje Error al buscar Material: " + e.getMessage());
			System.out.println("Stack Trace al buscar Material: " + e.getStackTrace());
			AdministradorConexiones.getInstancia().cerrarConexion(con);
		}
		return null;
		
	}
	
	
}

